package tacos.simpleflow;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.annotation.Transformer;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.file.FileWritingMessageHandler;
import org.springframework.integration.file.support.FileExistsMode;
import org.springframework.integration.transformer.GenericTransformer;
import org.springframework.messaging.MessageChannel;

import java.io.File;

@Configuration
public class FileWriterIntegrationConfig {

    @Bean
    @Transformer(inputChannel = "textInChannel",outputChannel = "fileWriterChannel")  // 配置转换器，将通道中的文本转换为大写
    // 接收来自 textInChannel 通道的消息，然后将消息写入到名为 fileWriterChannel 的通道中
    public GenericTransformer<String,String> upperCaseTransformer(){
        return text -> text.toUpperCase();
    }

    @Bean
    @ServiceActivator(inputChannel = "fileWriterChannel")
    // 接收来自 fileWriterChannel 的消息，并且会将消息传递给 FileWritingMessageHandler实例所定义的服务
    // FileWritingMessageHandler 会将消息的载荷写入特定目录的一个文件中，而文件的名称是通过消息的file_name头信息指定的。写入的方式为追加
    public FileWritingMessageHandler fileWriter(){  // 文件写入的消息处理器
        FileWritingMessageHandler handler = new FileWritingMessageHandler(new File("D:\\springbootFile"));
        handler.setExpectReply(false);  // 告诉服务激活器(serviceactivator不用期望会有答复通道relpychannel:将某个值返给流中的上游组件)
        // 如果不调用setExpectReply(),文件写入bean的默认只是true。尽管管道的功能和预期一样，但是在日志中会看到一些错误日志，提示我们没有设置答复通道。
        handler.setFileExistsMode(FileExistsMode.APPEND);
        handler.setAppendNewLine(true);
        return handler;
    }

    /**
     * 没有必要显式声明通道，如果名为textInchannel和FilewriterChannel的bean不存在，那么这连个通道将会自动创建
     * 如果想要更加精确的控制通道配置，可以按照如下的方式显式构件这邪恶bean
     * @return
     */
//    @Bean
//    public MessageChannel textInChannel(){
//        return new DirectChannel();
//    }

    @Bean
    public MessageChannel fileWriterChannel(){
        return new DirectChannel();
    }
}
